package cn.rocky.prepare;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * n 只已经打开的灯泡
 */
public class flipLights {

    /**
     * 开关1: 开关互换
     * 开关2: 偶数
     * 开关3: 奇数
     * 开关4: j = 3k + 1
     *
     * 编号为 6k+1, 受按钮 1,3,4影响；
     * 编号为 6k+2, 6k+6受按钮 1,2影响；
     * 编号为 6k+3, 6k+5受按钮 1,3影响；
     * 编号为 6k+46k+4，受按钮 1,2,4影响。
     *
     */
    public int flipLights(int n, int presses) {
        Set<Integer> seen = new HashSet<Integer>();
        for (int i = 0; i < 1 << 4; i++) {
            int[] pressArr = new int[4];
            for (int j = 0; j < 4; j++) {
                pressArr[j] = (i >> j) & 1;
            }
            int sum = Arrays.stream(pressArr).sum();
            if (sum % 2 == presses % 2 && sum <= presses) {
                int status = pressArr[0] ^ pressArr[1] ^ pressArr[3];
                if (n >= 2) {
                    status |= (pressArr[0] ^ pressArr[1]) << 1;
                }
                if (n >= 3) {
                    status |= (pressArr[0] ^ pressArr[2]) << 2;
                }
                if (n >= 4) {
                    status |= (pressArr[0] ^ pressArr[1] ^ pressArr[3]) << 3;
                }
                seen.add(status);
            }
        }
        return seen.size();
    }
}